接續昨天的內容,今天會介紹網路相關的helper function。由於網路這塊的helper function相對比較雜多,所以有點難以分類,所以只有XDP和LWT有單獨分類出來,其他的tc, socket相關的全部歸在一類。
於XDP修改封包大小(可以增大或縮小)
XDP_TX redirect使用
XDP輸出封包內容到perf event
調整xdp_md->data_meta
查詢fid (Forward Information Base, L2)
用於BPF_PROG_TYPE_CGROUP_SOCK_ADDR
,修改bind address
讀取封包內容
修改封包內容,可自動更新chekcsum
改寫l3, l4的checksum
用於計算check sum,可搭配前兩個replace函數使用
取得xfrm (IPsec相關)
將封包發到其他的device。後者會複製一分封包。
取得classid,參考cgroup 的net_cls,使用於TC egress path。
增減vlan header
取得、修改封包的tunnel(ex. GRE)的tunnel key資訊
取得、修改封包的tunnel資訊
取得skb的tclassid欄位,用於clsact TC egress
修改封包 prtocol (ipv4, ipv6)
修改封包類型 (broadcast, multicast, unitcast..)
搭配BPF_MAP_TYPE_CGROUP_ARRAY
使用,檢查skb是不是在某個cgroup v2節點的子節點內。
取得skb對應的cgroup id
向上查找skb對應cgroup節點的祖先節點id
取得、修改skb->hash
修改封包大小
用於封包payload存取,具體內容有點難理解 (non-linear data)
修改skb->csum
修改skb->csum_level
標註skb->hash
為無效,觸發重算
將skb->sk
轉成所有欄位都可以訪問的版本
從skb->sk
取得struct bpf_tcp_sock
向tcp-sock對應的方向發一個tcp-ack
從skb->sk
取得bpf_sock
設置skb->sk
取得bpf_sock對應的cgroupv2 id
取得bpf_sock對應cgroupv2節點的祖先id
強制轉型sk成特定的XXX_sock結構
增加packet header區 (headroom) 長度,用於為L3封包直接加上L2的header
幫socket建立一個cookie,作為socket的identifier,用於追蹤
取得socket的owner UID
模擬呼叫getsocketopt、setsockopt
存取skb的ebpf local storage
將封包內容輸出到perf event
修改封包payload大小,可以從L2或L3的角度來看
產生、尋找封包對應的SYN cookie ACK
+ bpf_tcp_gen_syncookie
+ bpf_tcp_check_syncookie
BPF_PROG_TYPE_SK_SKB
(ingress方向)
BPF_MAP_TYPE_SOCKMAP
做socket redierct
BPF_PROG_TYPE_SK_MSG
(egress方向)
BPF_MAP_TYPE_SOCKMAP
做socket redierct
更新BPF_MAP_TYPE_SOCKMAP
設置bpf_sock_ops->bpf_sock_ops_cb_flags
欄位
更新sockhash
用於BPF_PROG_TYPE_SK_REUSEPORT
(將多個程式綁定在同一個port上)
用於BPF_PROG_TYPE_CGROUP_SKB
,設置ECN (Explicit Congestion Notification)
到此,我們完成了幾乎所有helper functions的速介,今天同時也是這個系列的第三十天,到了這個系列的尾聲。
很臨時也沒有經驗和準備的參加了ithome鐵人三十天,同時選擇了eBPF這個沒有真正實際接觸過的主題。很開心能夠透過這三十天的時間,對eBPF這個系統有一個初步的認知,並把搜尋和整理後的資料分享給大家,並建立了一個幾乎每天查資料寫文章的習慣。
比較可惜的是如前面所說,並沒有一開始規劃好整個30天的文章框架,再加上是完全沒有接觸過的主題,每天的文章內容分量和知識量比預期能寫的要少許多,介紹基本知識和BCC的天數也完全超出了預期,因此很可惜的沒有能在這個系列裡講到原本要介紹的Cilium CNI。加上對eBPF還有tc系統的不熟悉,因此在許多地方的介紹可能並不是非常清楚或有錯誤,還請大家見諒,還有歡迎提出更正。
這次算是花了30天累積寫文章的經驗,以及除了對eBPF的學習外,還有對Linux kernel souce code還有linux上的一些網路系統概念的學習。
到這邊下台一鞠躬,希望這個系列有幫助到大家!
本系列30天鐵人文章整理重新發表在我的個人部落格,我的部落格還有其他openstack, terraform, cni相關的文章,有興趣可以來了解交流~!